# -*- coding: utf-8 -*-
"""
  @author: xiaoxiong
  @data:  2021/10/18 21:48
  @function:
"""
import pygame
import random
import os


class Game:
    # __init__ 方法 实例刚刚产生时要做的事
    def __init__(self, state_dict, start_state):

        # 初始化 设置屏幕大小 放到 setup.pu中,然后在main.py中导入刚刚修改的setup.py
        # pygame.init()
        # pygame.display.set_mode((800, 600))


        # 获取屏幕图层
        self.screen = pygame.display.get_surface()
        # 钟
        '''
          跟踪屏幕运行的时间外，还能控制游戏的帧速率
        '''
        self.clock = pygame.time.Clock()
        self.keys = pygame.key.get_pressed()
        self.state_dict = state_dict
        self.state = state_dict[start_state]

    def update(self):
        if self.state.finished:
            # 把上个阶段的游戏信息拿出来
            game_info = self.state.game_info
            next_state = self.state.next
            self.state.finished = False
            self.state = self.state_dict[next_state]
            # 传给下个阶段的 start 方法
            self.state.start(game_info)
        self.state.update(self.screen, self.keys)

    def run(self, state):
        # 测试代码 应该放入 setup.py中去
        # GRAPHICS = load_graphics('resources/graphics')

        # 更新部分
        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.display.quit()
                    quit()
                elif event.type == pygame.KEYDOWN:
                    # get_pressed() 返回装满01的列表，记录了各个键盘的状态
                    # 1代表被按下，0代表没有
                    self.keys = pygame.key.get_pressed()
                elif event.type == pygame.KEYUP:
                    self.keys = pygame.key.get_pressed()

            '''
               图片素材加载和剪裁的测试代码
            # fill 油漆桶的填充
            self.screen.fill((random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)))

            # 测试代码
            image = get_image(GRAPHICS['mario_bros'], 145, 32, 16, 16, (0, 0, 0), 5)
            self.screen.blit(image, (30, 300))
            '''

            '''
               加载主屏幕的测试代码
            '''
            self.update()

            # 更新屏幕
            pygame.display.update()

            # 钟
            self.clock.tick(60)


'''
加载图片
   path: 图片所在路径
   accept：可读文件类型
'''


def load_graphics(path, accept=('.jpg', '.png', '.bmp', '.gif')):
    graphics = {}
    # 遍历文件夹
    for pic in os.listdir(path):
        # 拆分文件为文件名和后缀名
        name, ext = os.path.splitext(pic)
        if ext.lower() in accept:
            # 如果是可接受的类型，就用pygame.image.load()方法载入图片
            img = pygame.image.load(os.path.join(path, pic))
            # 如果图片是带有透明底的图，则统一转化成标准的带有透明层的格式
            # 否则转化为普通的图片格式
            if img.get_alpha():
                img = img.convert_alpha()
            else:
                img = img.convert()
            # 放入字典里去
            graphics[name] = img

    return graphics


'''
从已经加载好的图片里获取需要的图片
   sheet: 图片
   x, y： 具体某个小图片的坐标
   width, height: 小图片的宽高
   colorkey： 快速抠图的底色(把图片的背景设置成的颜色)
   scale: 放大倍数
'''


def get_image(sheet, x, y, width, height, colorkey, scale):
    # 创建一个和方框一样大的空图层
    image = pygame.Surface((width, height))
    # (0, 0) 代表画到哪个位置 (x, y, width, height)代表sheet里那个小区域要取出来
    # 调用blit方法往自己身上画图，图片来自传入的sheet,且从左上角(0,0)开始画，画的内容是方框定位的内容
    image.blit(sheet, (0, 0), (x, y, width, height))
    # 底色抠图
    image.set_colorkey(colorkey)
    # 放大图片
    image = pygame.transform.scale(image, (int(width*scale), int(height*scale)))
    return image








